from selenium.webdriver.common.by import By
from base.basepage import BasePage
from pages.main_page import MainPage


class StatisticsPage(BasePage):
    """实时统计页面"""

    def __init__(self):
        super().__init__()
        # 回到首页
        self.back_main_activity()
        # 点击行情tab
        main_page = MainPage()
        main_page.click_tab(tab_index=2)
        # 点击导航遮罩
        self.click_mask()
        # 点击右上角"实时统计"入口图标
        self.driver.find_element(By.ID, "rl_stastics_entry").click()

    # 交易所汇总行情数据
    def get_total_data(self):
        # 元素—— 统计单位 （手） （亿元）
        tv_total_unit = self.driver.find_element(By.ID, "tv_total_unit")
        # 元素—— 交易所汇总行情
        ll_statistics_total = self.driver.find_element(By.ID, "ll_stastics_total")
        bottom_bounds = self.getBounds(tv_total_unit)
        top_bounds = self.getBounds(ll_statistics_total)

        # 把 交易所汇总行情数据列表划出来
        self.swipe_no_release(bottom_bounds[0], bottom_bounds[3],
                              bottom_bounds[0], top_bounds[3])
        self.driver.tap([(top_bounds[0], top_bounds[1])])
        self.fix_title_bounds = top_bounds

        # 元素—— 交易所汇总行情-横向列表
        rv_ce_total_details = self.driver.find_element(By.ID, "rv_ce_total_details")
        # 元素—— 一列交易所数据的 LinearLayout
        ll_str = ".//android.widget.LinearLayout/android.widget.LinearLayout"
        ll_arr = rv_ce_total_details.find_elements(By.XPATH, ll_str)
        # 通过LinearLayout 获取前两个交易所的所有数据，断言不含字符负号 "-"
        print("交易所汇总行情数据------------------")
        self.get_total_by_exchange(ll_arr[0])
        self.get_total_by_exchange(ll_arr[1])
        # 左滑两个交易所的距离
        self.swipe_two_exchange(ll_arr[0], ll_arr[1])
        # 重新查找元素 一列交易所数据的LinearLayout，获取所有数据
        ll_arr = rv_ce_total_details.find_elements(By.XPATH, ll_str)
        self.get_total_by_exchange(ll_arr[0])
        self.get_total_by_exchange(ll_arr[1])
        self.get_total_by_exchange(ll_arr[2])

    # 交易所汇总行情 - 一列交易所数据
    def get_total_by_exchange(self, exchange):
        # 交易所
        exchange_name = exchange.find_element(By.ID, "tv_stastic_total_title").text
        # 成交量
        total_vol = exchange.find_element(By.ID, "atv_stastic_total_vol").text
        # 成交量占比
        total_vol_rate = exchange.find_element(By.ID, "atv_stastic_total_vol_rate").text
        # 持仓量
        total_pos = exchange.find_element(By.ID, "atv_stastic_total_pos").text
        # 持仓量占比
        total_pos_rate = exchange.find_element(By.ID, "atv_stastic_total_pos_rate").text
        # 成交额
        total_price = exchange.find_element(By.ID, "atv_stastic_total_price").text
        # 成交额占比
        total_price_rate = exchange.find_element(By.ID, "atv_stastic_total_price_rate").text
        # 大商所  7,463,542  28.05%  11,960,513  36.55%  4,559  19.00%
        total_all_str = f"{exchange_name}  {total_vol}  {total_vol_rate}  {total_pos}  " \
                        f"{total_pos_rate}  {total_price}  {total_price_rate}"
        print(total_all_str)
        # 断言交易所汇总行情数据没有负值
        self.assertNotIn("-", total_all_str)

    # 左滑两个交易所的距离
    def swipe_two_exchange(self, ll_arr_0, ll_arr_1):
        # 大商所，上期所元素范围
        if not hasattr(self, "item_0"):
            item_0 = self.getBounds(ll_arr_0)
            item_1 = self.getBounds(ll_arr_1)
            self.item_0 = item_0
            self.item_1 = item_1
        # 左滑两个交易所的距离，查看后边三个交易所的数据
        self.driver.swipe(self.item_1[2], self.item_1[1], self.item_0[0], self.item_0[1])

    # 交易所期货行情数据
    def get_futures_data(self):
        # 固定滑动一个距离，目的：划出来下一个元素 "统计单位 （手） （亿元）",到可视页面
        self.swipe_no_release(100, 1880, 100, 580)
        self.driver.tap([(0, self.fix_title_bounds[3])])

        # 元素—— 统计单位 （手） （亿元）
        tv_total_unit = self.driver.find_element(By.ID, "tv_ftr_unit")
        bottom_bounds = self.getBounds(tv_total_unit)

        # 把 交易所汇总行情数据列表划出来
        self.swipe_no_release(bottom_bounds[0], bottom_bounds[3],
                              bottom_bounds[0], self.fix_title_bounds[3])
        self.driver.tap([(0, self.fix_title_bounds[3])])

        # 元素—— 交易所汇总行情-横向列表
        rv_ce_ftr_details = self.driver.find_element(By.ID, "rv_ce_ftr_details")
        # 元素—— 一列交易所数据的 LinearLayout
        ll_str = ".//android.widget.LinearLayout/android.widget.LinearLayout"
        ll_arr = rv_ce_ftr_details.find_elements(By.XPATH, ll_str)
        # 通过LinearLayout 获取前两个交易所的所有数据，断言不含字符负号 "-"
        print("交易所期货行情数据------------------")
        self.get_futures_by_exchange(ll_arr[0])
        self.get_futures_by_exchange(ll_arr[1])
        # 左滑两个交易所的距离，查看后边三个交易所的数据
        self.swipe_two_exchange(ll_arr[0], ll_arr[1])
        # 重新查找元素 一列交易所数据的LinearLayout，获取所有数据
        ll_arr = rv_ce_ftr_details.find_elements(By.XPATH, ll_str)
        self.get_futures_by_exchange(ll_arr[0])
        self.get_futures_by_exchange(ll_arr[1])
        self.get_futures_by_exchange(ll_arr[2])

    # 交易所汇总行情 - 一列交易所数据
    def get_futures_by_exchange(self, change):
        # 交易所
        change_name = change.find_element(By.ID, "tv_stastic_title").text
        # 成交量
        vol = change.find_element(By.ID, "atv_stastic_vol").text
        # 成交量占比
        vol_rate = change.find_element(By.ID, "atv_stastic_vol_rate").text
        # 持仓量
        pos = change.find_element(By.ID, "atv_stastic_pos").text
        # 持仓量占比
        pos_rate = change.find_element(By.ID, "atv_stastic_pos_rate").text
        # 成交额
        turnover = change.find_element(By.ID, "atv_stastic_turnover").text
        # 成交额占比
        turnover_rate = change.find_element(By.ID, "atv_stastic_turnover_rate").text
        # 持仓额
        pos_price = change.find_element(By.ID, "atv_stastic_pos_price").text
        # 日增仓  可能为负值
        # daily_add = change.find_element(By.ID, "atv_stastic_daily_add").text
        # 资金流向  可能为负值
        # money_flow = change.find_element(By.ID, "atv_stastic_money_flow").text

        # 大商所  1,530,338  30.89%  10,365,987  34.76%  997  29.52%  6,159
        all_str = f"{change_name}  {vol}  {vol_rate}  {pos}  {pos_rate}  {turnover}  {turnover_rate}  {pos_price}"
        print(all_str)
        # 断言交易所汇总行情数据没有负值
        self.assertNotIn("-", all_str)
